package org.cybzacg.encryption.core;

import org.cybzacg.encryption.enums.EncryptionAlgorithm;
import org.cybzacg.encryption.model.EncryptionResult;
import org.cybzacg.encryption.model.ValidationResult;
import org.cybzacg.encryption.context.EncryptionContext;

/**
 * 加密器核心接口
 * 定义所有加密器必须实现的基本功能
 *
 * @author encryption team
 * @version 1.0
 */
public interface Encryptor {

    /**
     * 加密数据
     *
     * @param data 待加密的数据
     * @param context 加密上下文
     * @return 加密结果
     * @throws org.cybzacg.encryption.exception.EncryptionException 加密异常
     */
    EncryptionResult encrypt(byte[] data, EncryptionContext context);

    /**
     * 解密数据
     *
     * @param encryptedData 加密后的数据
     * @param context 解密上下文
     * @return 解密结果
     * @throws org.cybzacg.encryption.exception.EncryptionException 解密异常
     */
    EncryptionResult decrypt(byte[] encryptedData, EncryptionContext context);

    /**
     * 验证密钥或配置的有效性
     *
     * @param context 验证上下文
     * @return 验证结果
     */
    ValidationResult validate(EncryptionContext context);

    /**
     * 获取加密器类型
     *
     * @return 加密器类型
     */
    org.cybzacg.encryption.enums.EncryptionType getType();

    /**
     * 获取支持的算法
     *
     * @return 支持的算法
     */
    EncryptionAlgorithm getAlgorithm();

    /**
     * 获取加密器优先级
     * 数值越小优先级越高
     *
     * @return 优先级值
     */
    int getPriority();

    /**
     * 检查是否支持指定的上下文配置
     *
     * @param context 加密上下文
     * @return 是否支持
     */
    boolean supports(EncryptionContext context);

    /**
     * 获取加密器描述
     *
     * @return 描述信息
     */
    String getDescription();

    /**
     * 获取提供者名称
     *
     * @return 提供者名称
     */
    String getProvider();

    /**
     * 获取元数据
     *
     * @return 元数据映射
     */
    java.util.Map<String, Object> getMetadata();

    /**
     * 获取操作计数
     *
     * @return 操作次数
     */
    long getOperationCount();

    /**
     * 获取平均处理时间
     *
     * @return 平均处理时间（毫秒）
     */
    long getAverageProcessingTime();

    /**
     * 重置统计信息
     */
    void reset();

    /**
     * 初始化加密器
     *
     * @param context 初始化上下文
     * @throws org.cybzacg.encryption.exception.EncryptionException 初始化异常
     */
    void initialize(EncryptionContext context);

    /**
     * 关闭加密器并清理资源
     */
    void close();
}
